all repos — caroster @ 5de36530ae6541fc9811e919aec1a980e9a155e1

[Octree] Group carpool to your event https://caroster.io

frontend/pages/e/[uuid]/waitingList.tsx (view raw)

 1import {useState, useMemo, PropsWithChildren, useReducer} from 'react';
 2import useProfile from '../../../hooks/useProfile';
 3import WaitingList from '../../../containers/WaitingList';
 4import pageUtils from '../../../lib/pageUtils';
 5import EventLayout, {TabComponent} from '../../../layouts/Event';
 6import {AddPassengerToWaitingList} from '../../../containers/NewPassengerDialog';
 7import {EventByUuidDocument} from '../../../generated/graphql';
 8import {getLocaleForLang} from '../../../lib/getLocale';
 9
10interface Props {
11  eventUUID: string;
12  announcement?: string;
13}
14
15const Page = (props: PropsWithChildren<Props>) => {
16  return <EventLayout {...props} Tab={WaitingListTab} />;
17};
18
19const WaitingListTab: TabComponent<Props> = ({event}) => {
20  const {userId} = useProfile();
21  const [dialogOpen, toggleDialog] = useReducer(i => !i, false);
22  const [isSelfAdd, setIsSelfAdd] = useState(false);
23
24  const registered = useMemo(() => {
25    if (!userId) return false;
26    const isInWaitingList = event?.waitingPassengers?.data?.some(
27      passenger => passenger.attributes.user?.data?.id === `${userId}`
28    );
29    return isInWaitingList;
30  }, [event, userId]);
31
32  return (
33    <>
34      <WaitingList
35        registered={registered}
36        canAddSelf={!!userId}
37        onAddSelf={() => {
38          setIsSelfAdd(true);
39          toggleDialog();
40        }}
41        onAddOther={() => {
42          setIsSelfAdd(false);
43          toggleDialog();
44        }}
45      />
46      <AddPassengerToWaitingList
47        open={dialogOpen}
48        toggle={toggleDialog}
49        addSelf={isSelfAdd}
50      />
51    </>
52  );
53};
54
55export const getServerSideProps = pageUtils.getServerSideProps(
56  async (context, apolloClient) => {
57    const {uuid} = context.query;
58    const {host = ''} = context.req.headers;
59    let event = null;
60
61    // Fetch event
62    try {
63      const {data} = await apolloClient.query({
64        query: EventByUuidDocument,
65        variables: {uuid},
66      });
67      event = data?.eventByUUID?.data;
68    } catch (error) {
69      return {
70        notFound: true,
71      };
72    }
73
74    const isCarosterPlus =
75      event?.attributes?.enabled_modules?.includes('caroster-plus');
76    if (isCarosterPlus)
77      return {
78        notFound: true,
79      };
80
81    const description = await getLocaleForLang(
82      event?.attributes?.lang,
83      'meta.description'
84    );
85
86    return {
87      props: {
88        eventUUID: uuid,
89        metas: {
90          title: event?.attributes?.name || '',
91          description,
92          url: `https://${host}${context.resolvedUrl}`,
93        },
94      },
95    };
96  }
97);
98
99export default Page;